<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
  <!--LRU（最近最少使用）缓存类实现使用Map数据结构存储键值对，并维护键的插入顺序当缓存达到容量上限时，会自动淘汰最久未使用的键-->
  class LRUCache{
    /**
     * 构造函数，初始化缓存容量
     * @param {number} capacity - 缓存的最大容量，必须为正整数
     * @throws {Error} 如果capacity不是正整数则抛出错误
     */
    constructor(capacity) {
      // 参数有效性校验
      if(typeof capacity !== 'number' || capacity <= 0){
        throw new Error('capacity must be a positive integer')
      }
      // 初始化缓存容量和存储结构
      this.size = capacity
      this.data = new Map() // 使用Map保存键值对并维护插入顺序
    }

    /**
     * 添加/更新缓存项
     * @param {any} key - 要存储的键
     * @param {any} value - 要存储的值
     */
    put(key,value){
      // 如果键已存在，先删除旧记录（后续重新添加以实现位置更新）
      if(this.data.has(key)){
        this.data.delete(key)
      }
      // 当缓存已满且添加的是新键时，淘汰最久未使用的项
      else if(this.data.size >= this.size){
        // Map.keys()返回迭代器，next().value获取第一个键（最久未使用）
        const firstKey = this.data.keys().next().value
        this.data.delete(firstKey)
      }
      // 添加新记录（新键或更新后的键都会成为最新使用）
      this.data.set(key,value)
    }

    /**
     * 获取缓存项的值
     * @param {any} key - 要查找的键
     * @returns {any|undefined} 找到返回对应值，未找到返回undefined
     */
    get(key){
      // 键不存在时直接返回undefined
      if(!this.data.has(key)){
        return undefined
      }
      // 获取当前值后删除原记录
      const value = this.data.get(key)
      this.data.delete(key)
      // 重新插入使该键成为最新使用项
      this.data.set(key,value)
      return value
    }
  }

  const cache = new LRUCache(2);
  cache.put(1, 1);
  cache.put(2, 2);
  console.log(cache.get(1)); // 1
  cache.put(3, 3); // 淘汰键2
  console.log(cache.get(2)); // undefined

</script>
</html>